let {AsyncParallelHook} = require('tapable'); // 异步并行钩子
// 异步钩子 (串行，并行) 需要等待所有并发的异步事件执行后 再执行回调方法
// 同时发送多个请求
// 注册方法分为 tap注册 和 tapAsync注册

// tapable 库中有三种注册方法 tap 同步注册 tapAsync(cb) tapPromise(注册是 promise)
class Lesson {
  constructor() {
    this.hooks = {
      arch: new AsyncParallelHook(['name']),
    };
    this.index = 0;
  }

  tapPromise() { // 注册监听函数
    this.hooks.arch.tapPromise('node', (name) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('node', name);
          resolve();
        }, 1000);
      });
    });

    this.hooks.arch.tapPromise('react', (name) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('react', name);
          resolve();
        }, 1000);
      });
    });
  }

  start() {
    this.hooks.arch.promise('gzw')
      .then(() => {
        console.log('end');
      });
  }
}

let l = new Lesson();
l.tapPromise(); // 注册这两个事件
l.start(); // 启动钩子
